package cn.green.core.model;

import cn.green.core.components.store.table.TableTypeStore;
import cn.green.core.components.table.TableTypeCom;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author wang.yishu
 * @version 1.0
 * @className QTable
 * @description 表信息
 * @date 2024/11/12 15:41
 */
@Data
public class QTable implements Serializable {
    /**
     * 主键
     */
    protected Integer id;

    /**
     * 数据源名称
     */
    protected String sourceName;

    /**
     * 所属数据库名
     */
    protected String schemeName;

    /**
     * 表名
     */
    protected String tableName;

    /**
     * 表别名
     */
    protected String tableAliasName;

    /**
     * 表类型
     */
    protected String tableType;

    /**
     * 表代码
     */
    protected String tableCode;

    /**
     * 删除标识
     */
    protected Integer delStatus;

    /**
     * 创建时间
     */
    protected Date createTime;

    /**
     * 创建人
     */
    protected String createUser;

    /**
     * 修改时间
     */
    protected Date updateTime;

    /**
     * 修改人
     */
    protected String updateUser;

    /**
     * 表字段列表
     */
    protected List<QField> fields;

    protected boolean needAs = false;
    protected String asTable = this.tableName;

    /**
     * 获取该表的初始字段
     */
    public List<QField> initialFields() {
        //获取当前表类型
        String tableType = this.tableType;
        TableTypeCom tableTypeCom = TableTypeStore.get(tableType);
        //得到该表的主键
        QField primaryKeyField = tableTypeCom.getPrimaryKeyField();
        //得到该表的固定字段
        List<QField> qFields = tableTypeCom.fixFields();
        //得到该表的删除建
        QField deleteKeyField = tableTypeCom.getDeleteKeyField();
        QField parentKeyField = tableTypeCom.getParentKeyField();
        qFields.add(0, primaryKeyField);
        List<QField> fields = this.getFields();
        if (fields != null && !fields.isEmpty()) {
            for (QField field : fields) {
                if (qFields.stream().anyMatch(item -> !item.getFieldName().equals(field.getFieldName()))) {
                    qFields.add(field);
                }
            }
        }
        if (parentKeyField != null) {
            qFields.add(parentKeyField);
        }
        qFields.add(deleteKeyField);
        List<QField> rtn = new ArrayList<>();
        for (QField qField : qFields) {
            rtn.addAll(qField.allFields());
        }
        return rtn;
    }

}
